home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / sendmail / sendmail-5.65 / src / convtime.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-05  |  3.5 KB  |  179 lines

  1. /*
  2.  * Copyright (c) 1983 Eric P. Allman
  3.  * Copyright (c) 1988 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms are permitted provided
  7.  * that: (1) source distributions retain this entire copyright notice and
  8.  * comment, and (2) distributions including binaries display the following
  9.  * acknowledgement:  ``This product includes software developed by the
  10.  * University of California, Berkeley and its contributors'' in the
  11.  * documentation or other materials provided with the distribution and in
  12.  * all advertising materials mentioning features or use of this software.
  13.  * Neither the name of the University nor the names of its contributors may
  14.  * be used to endorse or promote products derived from this software without
  15.  * specific prior written permission.
  16.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  17.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  18.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  19.  */
  20.  
  21. #ifndef lint
  22. static char sccsid[] = "@(#)convtime.c    5.4 (Berkeley) 6/1/90";
  23. #endif /* not lint */
  24.  
  25. # include <ctype.h>
  26. # include "useful.h"
  27.  
  28. /*
  29. **  CONVTIME -- convert time
  30. **
  31. **    Takes a time as an ascii string with a trailing character
  32. **    giving units:
  33. **      s -- seconds
  34. **      m -- minutes
  35. **      h -- hours
  36. **      d -- days (default)
  37. **      w -- weeks
  38. **    For example, "3d12h" is three and a half days.
  39. **
  40. **    Parameters:
  41. **        p -- pointer to ascii time.
  42. **
  43. **    Returns:
  44. **        time in seconds.
  45. **
  46. **    Side Effects:
  47. **        none.
  48. */
  49.  
  50. time_t
  51. convtime(p)
  52.     char *p;
  53. {
  54.     register time_t t, r;
  55.     register char c;
  56.  
  57.     r = 0;
  58.     while (*p != '\0')
  59.     {
  60.         t = 0;
  61.         while (isdigit(c = *p++))
  62.             t = t * 10 + (c - '0');
  63.         if (c == '\0')
  64.             p--;
  65.         switch (c)
  66.         {
  67.           case 'w':        /* weeks */
  68.             t *= 7;
  69.  
  70.           case 'd':        /* days */
  71.           default:
  72.             t *= 24;
  73.  
  74.           case 'h':        /* hours */
  75.             t *= 60;
  76.  
  77.           case 'm':        /* minutes */
  78.             t *= 60;
  79.  
  80.           case 's':        /* seconds */
  81.             break;
  82.         }
  83.         r += t;
  84.     }
  85.  
  86.     return (r);
  87. }
  88. /*
  89. **  PINTVL -- produce printable version of a time interval
  90. **
  91. **    Parameters:
  92. **        intvl -- the interval to be converted
  93. **        brief -- if TRUE, print this in an extremely compact form
  94. **            (basically used for logging).
  95. **
  96. **    Returns:
  97. **        A pointer to a string version of intvl suitable for
  98. **            printing or framing.
  99. **
  100. **    Side Effects:
  101. **        none.
  102. **
  103. **    Warning:
  104. **        The string returned is in a static buffer.
  105. */
  106.  
  107. # define PLURAL(n)    ((n) == 1 ? "" : "s")
  108.  
  109. char *
  110. pintvl(intvl, brief)
  111.     time_t intvl;
  112.     bool brief;
  113. {
  114.     static char buf[256];
  115.     register char *p;
  116.     int wk, dy, hr, mi, se;
  117.  
  118.     if (intvl == 0 && !brief)
  119.         return ("zero seconds");
  120.  
  121.     /* decode the interval into weeks, days, hours, minutes, seconds */
  122.     se = intvl % 60;
  123.     intvl /= 60;
  124.     mi = intvl % 60;
  125.     intvl /= 60;
  126.     hr = intvl % 24;
  127.     intvl /= 24;
  128.     if (brief)
  129.         dy = intvl;
  130.     else
  131.     {
  132.         dy = intvl % 7;
  133.         intvl /= 7;
  134.         wk = intvl;
  135.     }
  136.  
  137.     /* now turn it into a sexy form */
  138.     p = buf;
  139.     if (brief)
  140.     {
  141.         if (dy > 0)
  142.         {
  143.             (void) sprintf(p, "%d+", dy);
  144.             p += strlen(p);
  145.         }
  146.         (void) sprintf(p, "%02d:%02d:%02d", hr, mi, se);
  147.         return (buf);
  148.     }
  149.  
  150.     /* use the verbose form */
  151.     if (wk > 0)
  152.     {
  153.         (void) sprintf(p, ", %d week%s", wk, PLURAL(wk));
  154.         p += strlen(p);
  155.     }
  156.     if (dy > 0)
  157.     {
  158.         (void) sprintf(p, ", %d day%s", dy, PLURAL(dy));
  159.         p += strlen(p);
  160.     }
  161.     if (hr > 0)
  162.     {
  163.         (void) sprintf(p, ", %d hour%s", hr, PLURAL(hr));
  164.         p += strlen(p);
  165.     }
  166.     if (mi > 0)
  167.     {
  168.         (void) sprintf(p, ", %d minute%s", mi, PLURAL(mi));
  169.         p += strlen(p);
  170.     }
  171.     if (se > 0)
  172.     {
  173.         (void) sprintf(p, ", %d second%s", se, PLURAL(se));
  174.         p += strlen(p);
  175.     }
  176.  
  177.     return (buf + 2);
  178. }
  179.